<!DOCTYPE html>
<html>
<header>
    <meta charset="utf-8" />
    <script>

// https://es6.ruanyifeng.com/#docs/reflect
        // 先定义了一个Set集合，所有观察者函数都放进这个集合。
        // 然后，observable函数返回原始对象的代理，拦截赋值操作。
        // 拦截函数set之中，会自动执行所有观察者。

        const myset = new Set();
        observe = fn => myset.add(fn);
        function observable(obj) {
            let myproxy = new Proxy(obj, {
                set: function (target, prop, value, receiver) {
                    Reflect.set(target, prop, value, receiver);
                    // 遍历set ，执行函数
                    myset.forEach(fn => fn());
                }
            });
            return myproxy;
        }


        const person = observable({
            name: '张三',
            age: 20
        });

        function print() {
            console.log(`${person.name}, ${person.age}`)
        }

        observe(print);


        person.name = '李四';
        person.age = '34';


        // var myObject = {
        //     foo: 1,
        //     bar: 2,
        //     [Symbol.for('baz')]: 3,
        //     [Symbol.for('bing')]: 4,
        // };
        // var parentobj = { name: "szq" };
        // Reflect.setPrototypeOf(myObject, parentobj);
        // console.log(myObject);

        // // // 旧写法
        // // Object.getOwnPropertyNames(myObject)
        // // // ['foo', 'bar']

        // // Object.getOwnPropertySymbols(myObject)
        // // //[Symbol(baz), Symbol(bing)]

        // // 新写法
        // console.log(Reflect.ownKeys(myObject));
        // console.log(Reflect.has(myObject,"name"));
        // console.log(Reflect.has(myObject,Symbol.for('baz')));
        // for(let item in myObject){
        //     console.log(item);
        // }


// ['foo', 'bar', Symbol(baz), Symbol(bing)]

// const p = new Proxy({}, {
//   defineProperty(target, prop, descriptor) {
//     console.log(descriptor);
//     return Reflect.defineProperty(target, prop, descriptor);
//   }
// });

// p.foo = 'bar';

// let myboj={};

// Reflect.defineProperty(myboj, "name", {value:"szq"});
// console.log(Reflect.getOwnPropertyDescriptor(myboj,"name"));

// {value: "bar", writable: true, enumerable: true, configurable: true}


        // const ages = [11, 33, 12, 54, 18, 96];
        // // // 旧写法
        // // const youngest = Math.min.apply(null, ages);
        // // const oldest = Math.max.apply(null, ages);
        // // const type = Object.prototype.toString.call(youngest);


        // // 新写法
        // const youngest = Reflect.apply(Math.min, null, ages);
        // const oldest = Reflect.apply(Math.max, null, ages);
        // const type = Reflect.apply(Object.prototype.toString, youngest, [])
        // console.log(youngest);
        // console.log(oldest);
        // console.log(type);

// class Greeting extends Object {
//     constructor(name){
//         super();
//         this.name=name;
//     }
//     get name1(){ return "szq1"}
//     getname1(){return this.name1;}

// }


// // function Greeting(name) {
// //   this.name = name;
// // }

// // new 的写法
// const instance = new Greeting('张三');

// console.log(instance);

// // Reflect.construct 的写法
// const instance2 = Reflect.construct(Greeting, ['张三']);
// console.log(instance2);


// let p = {
//   a: 'a'
// };

// let handler = {
//   set(target, key, value, receiver) {
//     console.log('set');
//     Reflect.set(target, key, value, receiver)
//   },
//   defineProperty(target, key, attribute) {
//     console.log('defineProperty');
//     Reflect.defineProperty(target, key, attribute);
//   }
// };

// let obj = new Proxy(p, handler);
// obj.a = 'A';

// set
// defineProperty
    </script>
</header>

<body>

</body>

</html>